feat(ValidationContextWrapper): add virtualized wrapper #3578
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Проблема
Валидации работают только с элементами, смонтированными в dom-дерево. Если есть данные, что невалидны по правилам валидации, но их не существует - форма будет считаться валидной. Проблемы появляются с отрисовкой больших списков. Если использовать виртуализацию, то неотрисованные данные не отвалидируются и данные, потенциально, сохранятся с ошибкой.
Решение
ValidationBuilder при создании сразу валидирует данные по правилам, переданным в него. У ValidationContainer\ValidationWrapper нет доступа явного к билдеру. Идея состоит в том, что мы передаем явно массив node, используемых для отрисовки строк\таблиц и читаем вглубь через ValidationReader до первого состояния error\warning и возвращаем индекс строки. Специальный кмопонент ValidationWrapperVirtualizedInternal при валидации передает этот индекс и сохраняет знание о том, что внутри него какой-то элемент невалиден.
Чек-лист перед запросом ревью
Добавлены тесты на все изменения
⬜ unit-тесты для логики
⬜ скриншоты для верстки и кросс-браузерности
✅ нерелевантно
Добавлена (обновлена) документация
✅ styleguidist для пропов и примеров использования компонентов
⬜ jsdoc для утилит и хелперов
⬜ комментарии для неочевидных мест в коде
⬜ прочие инструкции (
README.md
,contributing.md
и др.)⬜ нерелевантно
Изменения корректно типизированы
⬜ без использования
any
(см. PR2856
)✅ нерелевантно
Прочее
⬜ все тесты и линтеры на CI проходят
✅ в коде нет лишних изменений
⬜ заголовок PR кратко и доступно отражает суть изменений (он попадет в changelog)